/*
 * Classe para manipular arquivos
 */
package br.inf.acesso.regradenegocios.bancodedados;

import br.inf.acesso.regradenegocios.bancodedados.Conexao;
import br.inf.acesso.validadores.BancoDeDados;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
 *
 * @author Douglas Giordano
 */
public class ArquivoConexao {

    Conexao conexao;
    String nomeDiretorio;
    String nomeArquivo;

    public ArquivoConexao(String nomeDiretorio, String nomeArquivo) {
        this.nomeDiretorio = nomeDiretorio;
        this.nomeArquivo = nomeArquivo;
        conexao = new Conexao();
    }

    public boolean salvaConexao(Conexao conexao) {
        boolean salvou;
        try {

            FileWriter fileWriter = new FileWriter(arquivo(), false);

            PrintWriter printWriter = new PrintWriter(fileWriter);

            printWriter.print("<local>" + conexao.getLocal() + "</local>");
            printWriter.print("<porta>" + conexao.getPorta() + "</porta>");
            printWriter.print("<database>" + conexao.getBanco() + "</database>");
            printWriter.print("<usuario>" + conexao.getUsuario() + "</usuario>");
            printWriter.print("<senha>" + conexao.getSenha() + "</senha>");
            printWriter.flush();
            printWriter.close();
            salvou = true;

        } catch (IOException erro) {
            System.out.println("Ocorreu um erro ao criar o arquivo: " + erro);
            salvou = false;
        }
        return salvou;
    }

    /**
     * Busca informações para conexão no arquivo de conexão
     */
    public Conexao buscaConexao() {
        Conexao conexao = new Conexao();
        try {
            FileReader fileReader = new FileReader(arquivo());

            BufferedReader bufferedReader = new BufferedReader(fileReader);

            String linha = bufferedReader.readLine();

            conexao.setLocal(linha.substring(linha.indexOf("<local>") + "<local>".length(), linha.indexOf("</local>")));
            conexao.setPorta(Integer.parseInt(linha.substring(linha.indexOf("<porta>") + "<porta>".length(), linha.indexOf("</porta>"))));
            conexao.setBanco(linha.substring(linha.indexOf("<database>") + "<database>".length(), linha.indexOf("</database>")));
            conexao.setUsuario(linha.substring(linha.indexOf("<usuario>") + "<usuario>".length(), linha.indexOf("</usuario>")));
            conexao.setSenha(linha.substring(linha.indexOf("<senha>") + "<senha>".length(), linha.indexOf("</senha>")));

            fileReader.close();
            bufferedReader.close();

        } catch (IOException erro) {
            System.out.println("Ocorreu um erro ao criar o arquivo: " + erro);
        }
        return conexao;
    }

    private File arquivo() throws IOException {
        java.io.File diretorio;
        java.io.File arquivo = null;
            diretorio = new java.io.File(nomeDiretorio);
            arquivo = new java.io.File(diretorio, nomeArquivo);

            if (!diretorio.exists() || !arquivo.exists()) {//verifica se o diretorio existe
                diretorio.mkdirs();
                arquivo.createNewFile();
                salvaConexao(conexao);
            }
        return arquivo;
    }

    public boolean testaConexao(String driver, Conexao conexao, BancoDeDados banco) {
        boolean conectou;
        Connection con = null;
        try {
            Class.forName(driver);
            if (banco.equals(BancoDeDados.SQlServer)) {
                con = DriverManager.getConnection(conexao.getUrlSQLServer(), conexao.getUsuario(), conexao.getSenha());
            } else {
                if (banco.equals(BancoDeDados.Firebird)) {
                    con = DriverManager.getConnection(conexao.getUrlFirebird(), conexao.getUsuario(), conexao.getSenha());
                }
            }
            conectou = true;
            con.close();
        } catch (ClassNotFoundException erro) {
            JOptionPane.showMessageDialog(null, erro);
            conectou = false;
        } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, erro);
            conectou = false;
        }
        return conectou;
    }
}
